package web;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.faces.model.SelectItem;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.primefaces.model.DualListModel;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;

import service.PessoaService;
import util.UtilColecao;
import util.UtilMensagem;
import entity.Pessoa;
import enumeration.PessoaEnum;
import enumeration.TipoPessoaEnum;

@Controller
@Scope("view")
public class ManterPessoaMB extends CrudMBean implements Serializable {

	private static final long serialVersionUID = 2980992478110115218L;

	@Autowired
	private PessoaService pessoaService;

	private Pessoa pessoa;

	private List<Pessoa> listaPessoa;

	private PessoaEnum pessoaEnum;

	private DualListModel<TipoPessoaEnum> tiposPessoa;

	private Log log = LogFactory.getLog(ManterPessoaMB.class);

	public ManterPessoaMB() {
		log.debug("Inicializou o ManterPessoaMB.");
	}

	/**
	 * @see web.BaseManagedBean#postConstruct()
	 */
	@Override
	@PostConstruct
	public void postConstruct() throws Exception {
		super.postConstruct();
		iniciar();
	}

	public void doSalvarAction() {
		pessoa.setPessoa(pessoaEnum);
		pessoa.setListaTipoPessoa(tiposPessoa.getTarget());
		pessoaService.salvarPessoa(pessoa);
		iniciar();
		addInfoMessage(UtilMensagem.getMensagem("MSG_0025"));
	}

	private void iniciar() {
		pessoa = pessoaService.criarNovoPessoa(pessoaEnum);
		pessoaEnum = pessoa.getPessoa();
		popularListaTiposPessoas();
		listaPessoa = pessoaService.criarNovaListaPessoa();
	}

	public void doDetalharAction() {
		super.doDetalharAction();
		pessoa = pessoaService.buscarPessoaPorChave(pessoa.getId());
		pessoaEnum = pessoa.getPessoa();
		popularListaTiposPessoas();
	}

	/**
	 * @see web.CrudMBean#doRemoverAction()
	 */
	@Override
	public void doRemoverAction() {
		pessoaService.remover(pessoa);

	}

	public void listarPorExemplo() {
		listaPessoa = pessoaService.listarPessoasPorExemplo(pessoa);
	}

	public void doDesativarAction() {
		pessoaService.desativar(pessoa);
	}

	/**
	 * @see web.CrudMBean#limparTela()
	 */
	@Override
	protected void limparTela() {
		iniciar();

	}

	public List<SelectItem> getListaPessoas() {
		List<SelectItem> listaPessoas = new ArrayList<SelectItem>();
		for (PessoaEnum pessoa : PessoaEnum.values()) {
			listaPessoas.add(new SelectItem(pessoa, pessoa.getDescricao()));
		}
		return listaPessoas;
	}

	private void popularListaTiposPessoas() {
		if (UtilColecao.isColecaoVazia(pessoa.getListaTipoPessoa())) {
			tiposPessoa = new DualListModel<TipoPessoaEnum>(TipoPessoaEnum.getTipoPessoaList(), new ArrayList<TipoPessoaEnum>());
		} else {
			List<TipoPessoaEnum> tipo = new ArrayList<TipoPessoaEnum>();
			for (TipoPessoaEnum tipoPessoa : TipoPessoaEnum.getTipoPessoaList()) {
				if (!pessoa.getListaTipoPessoa().contains(tipoPessoa)) {
					tipo.add(tipoPessoa);
				}
			}
			tiposPessoa = new DualListModel<TipoPessoaEnum>(tipo, pessoa.getListaTipoPessoa());
		}

	}

	public boolean isPessoaFisica() {
		return pessoaEnum == PessoaEnum.FISICA;
	}

	public boolean isPessoaJuridica() {
		return pessoaEnum == PessoaEnum.JURIDICA;
	}

	public PessoaService getPessoaService() {
		return pessoaService;
	}

	public void setPessoaService(PessoaService pessoaService) {
		this.pessoaService = pessoaService;
	}

	public Pessoa getPessoa() {
		return pessoa;
	}

	public void setPessoa(Pessoa pessoa) {
		this.pessoa = pessoa;
	}

	public List<Pessoa> getListaPessoa() {
		return listaPessoa;
	}

	public void setListaPessoa(List<Pessoa> listaPessoa) {
		this.listaPessoa = listaPessoa;
	}

	public PessoaEnum getPessoaEnum() {
		return pessoaEnum;
	}

	public void setPessoaEnum(PessoaEnum pessoaEnum) {
		this.pessoaEnum = pessoaEnum;
	}

	public DualListModel<TipoPessoaEnum> getTiposPessoa() {
		return tiposPessoa;
	}

	public void setTiposPessoa(DualListModel<TipoPessoaEnum> tiposPessoa) {
		this.tiposPessoa = tiposPessoa;
	}

}
